package org.ttjhome.util;


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.Map;

import javax.security.auth.callback.Callback;
import javax.security.auth.callback.CallbackHandler;
import javax.security.auth.callback.NameCallback;
import javax.security.auth.callback.PasswordCallback;
import javax.security.auth.callback.TextOutputCallback;
import javax.security.auth.callback.UnsupportedCallbackException;
import javax.security.auth.login.LoginException;

import com.sun.security.auth.module.NTLoginModule;




public class NTLoginTest {


	public static void main(String[] args) {
		 NTLoginModule module = new NTLoginModule();
		 Map<String,String> options = new HashMap<String, String>();
		 options.put("debug", "true");
		 options.put("debugNative", "true");
		 NTLoginTest logintest = new NTLoginTest();
		 
		 CallbackHandler handler = logintest.new CallbackHandlerImpl();
		 module.initialize(null,handler , null, options);
		 try {
			module.login();
		} catch (LoginException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	 }

	 private class CallbackHandlerImpl implements CallbackHandler {

		@Override
		public void handle(Callback[] callbacks) throws IOException,
				UnsupportedCallbackException {
		     
		      	 for (int i = 0; i < callbacks.length; i++) {
		      	    if (callbacks[i] instanceof TextOutputCallback) {
		       
		      		// display the message according to the specified type
		      		TextOutputCallback toc = (TextOutputCallback)callbacks[i];
		      		switch (toc.getMessageType()) {
		      		case TextOutputCallback.INFORMATION:
		      		    System.out.println(toc.getMessage());
		      		    break;
		      		case TextOutputCallback.ERROR:
		      		    System.out.println("ERROR: " + toc.getMessage());
		      		    break;
		      		case TextOutputCallback.WARNING:
		      		    System.out.println("WARNING: " + toc.getMessage());
		      		    break;
		      		default:
		      		    throw new IOException("Unsupported message type: " +
		      					toc.getMessageType());
		      		}
		      
		      	    } else if (callbacks[i] instanceof NameCallback) {
		       
		      		// prompt the user for a username
		      		NameCallback nc = (NameCallback)callbacks[i];
		       
		      		// ignore the provided defaultName
		      		System.err.print(nc.getPrompt());
		      		System.err.flush();
		      		nc.setName((new BufferedReader
		      			(new InputStreamReader(System.in))).readLine());
		      
		      	    } else if (callbacks[i] instanceof PasswordCallback) {
		       
		      		// prompt the user for sensitive information
		      		PasswordCallback pc = (PasswordCallback)callbacks[i];
		      		System.err.print(pc.getPrompt());
		      		System.err.flush();
		      		pc.setPassword(readPassword(System.in));
		       
		      	    } else {
		      		throw new UnsupportedCallbackException
		      			(callbacks[i], "Unrecognized Callback");
		      	    }
		      	 }
		      	 
		      	 
		       }

		
	      private char[] readPassword(InputStream in) throws IOException {
	          return new char[0];
	         }
	}


}
